package fonctions;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Environment;
import android.util.Log;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class FileDialog {
	private static final String PARENT_DIR = "..";
	private final String TAG = getClass().getName();
	private String[] fileList;
	private File currentPath;
	public interface FileSelectedListener {
		void fileSelected(File file);
	}
	public interface DirectorySelectedListener {
		void directorySelected(File directory);
	}
	private ListenerList<FileSelectedListener> fileListenerList = new ListenerList<FileDialog.FileSelectedListener>();
	private ListenerList<DirectorySelectedListener> dirListenerList = new ListenerList<FileDialog.DirectorySelectedListener>();
	private final Activity activity;
	private boolean selectDirectoryOption;
	private boolean txtOnly;
	private String fileEndsWith;
	/**
	 * @param activity
	 * @param path
	 */
	public FileDialog(Activity activity, File path, boolean txtOnly) {
		this.activity = activity;
		this.txtOnly=txtOnly;
		if (!path.exists() || !path.isDirectory()) path = Environment.getExternalStorageDirectory();
		loadFileList(path);
	}
	/**
	 * @return file dialog
	 */
	public Dialog createFileDialog() {
		Dialog dialog = null;
		AlertDialog.Builder builder = new AlertDialog.Builder(activity);
		builder.setTitle(currentPath.getPath());
		if (selectDirectoryOption) {
			builder.setPositiveButton("Select directory", new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					Log.d(TAG, currentPath.getPath());
					fireDirectorySelectedEvent(currentPath);
				}
			});
		}
		builder.setItems(fileList, new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				String fileChosen = fileList[which];
				File chosenFile = getChosenFile(fileChosen);
				if (chosenFile.isDirectory()) {
					loadFileList(chosenFile);
					dialog.cancel();
					dialog.dismiss();
					showDialog();
				} else fireFileSelectedEvent(chosenFile);
			}
		});
		dialog = builder.show();
		return dialog;
	}
	public void addFileListener(FileSelectedListener listener) {
		fileListenerList.add(listener);
	}
	public void removeFileListener(FileSelectedListener listener) {
		fileListenerList.remove(listener);
	}
	public void setSelectDirectoryOption(boolean selectDirectoryOption) {
		this.selectDirectoryOption = selectDirectoryOption;
	}
	public void addDirectoryListener(DirectorySelectedListener listener) {
		dirListenerList.add(listener);
	}
	public void removeDirectoryListener(DirectorySelectedListener listener) {
		dirListenerList.remove(listener);
	}
	/**
	 * Show file dialog
	 */
	public void showDialog() {
		createFileDialog().show();
	}
	private void fireFileSelectedEvent(final File file) {
		fileListenerList.fireEvent(new ListenerList.FireHandler<FileSelectedListener>() {
			public void fireEvent(FileSelectedListener listener) {
				listener.fileSelected(file);
			}
		});
	}
	private void fireDirectorySelectedEvent(final File directory) {
		dirListenerList.fireEvent(new ListenerList.FireHandler<DirectorySelectedListener>() {
			public void fireEvent(DirectorySelectedListener listener) {
				listener.directorySelected(directory);
			}
		});
	}
	private void loadFileList(File path) {
		this.currentPath = path;
		List<String> r = new ArrayList<String>();
		if (path.exists()) {
			if (path.getParentFile() != null) r.add(PARENT_DIR);
			FilenameFilter filter = new FilenameFilter() {
				public boolean accept(File dir, String filename) {
					File sel = new File(dir, filename);
					if (!sel.canRead()) return false;
					if (selectDirectoryOption) return sel.isDirectory();
					else {
						boolean txtFile = filename.toLowerCase().endsWith(".txt");
						return !txtOnly || sel.isDirectory() || txtFile;
					}
				}
			};
			String[] fileList1 = path.list(filter);
			Collections.addAll(r, fileList1);
		}
		Collections.sort(r);
		fileList = r.toArray(new String[r.size()]);
	}
	private File getChosenFile(String fileChosen) {
		if (fileChosen.equals(PARENT_DIR)) return currentPath.getParentFile();
		else return new File(currentPath, fileChosen);
	}
	public void setFileEndsWith(String fileEndsWith) {
		this.fileEndsWith = fileEndsWith != null ? fileEndsWith.toLowerCase() : fileEndsWith;
	}
}